home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Tools / Win95 Secrets / SETUP.Z / LOG.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-19  |  5.4 KB  |  196 lines

  1. //==================================
  2. // APISPY32 - Matt Pietrek 1995
  3. // FILE: LOG.C
  4. //==================================
  5. #include <windows.h>
  6. #include <stdio.h>
  7. #include "parmtype.h"
  8. #include "return.h"
  9. #include "perthred.h"
  10.  
  11. // Helper function prototypes
  12. void MakeIndentString(PSTR buffer, UINT level);
  13. void DecodeParamsToString(PBYTE pParams, PDWORD pFrame, PSTR pszParams);
  14. BOOL GetLPSTR( PSTR ptr, PSTR buffer );
  15.  
  16. FILE *PLogFile = 0;
  17. extern DWORD TlsIndex;          // defined in RETURN.C
  18.  
  19. BOOL OpenLogFile(void)
  20. {
  21.     char szFilename[MAX_PATH];
  22.     PSTR pszExtension;
  23.     
  24.     GetModuleFileName( GetModuleHandle(0), szFilename, sizeof(szFilename) );
  25.     
  26.     pszExtension = strrchr(szFilename, '.');
  27.     if ( !pszExtension )
  28.         return FALSE;
  29.     
  30.     strcpy(pszExtension, ".out");
  31.         
  32.     PLogFile = fopen(szFilename, "wt");
  33.  
  34.     return (BOOL)PLogFile;
  35. }
  36.  
  37.  
  38. BOOL CloseLogFile(void)
  39. {
  40.     if ( PLogFile )
  41.         fclose( PLogFile );
  42.     return TRUE;
  43. }
  44.  
  45.  
  46. void __stdcall LogCall(PSTR pszName, PBYTE pParams, PDWORD pFrame)
  47. {
  48.     char szParams[512];
  49.     char szIndent[128];
  50.     PPER_THREAD_DATA pStack;
  51.     
  52.     if ( !PLogFile )
  53.         return;
  54.     
  55.     DecodeParamsToString(pParams, pFrame, szParams);
  56.     
  57.     pStack = (PPER_THREAD_DATA)TlsGetValue(TlsIndex);
  58.     if ( !pStack )
  59.         return;
  60.  
  61.     MakeIndentString(szIndent, pStack->FunctionStackPtr);
  62.  
  63.     fprintf(PLogFile, "%s%s(%s)\n", szIndent, pszName, szParams);
  64.     fflush(PLogFile);
  65.     
  66.     // Patch the return address of this function so that returns to us
  67.     InterceptFunctionReturn(pszName, pFrame);
  68. }
  69.  
  70. void DecodeParamsToString(PBYTE pParams, PDWORD pFrame, PSTR pszParams)
  71. {
  72.     unsigned i;
  73.     unsigned paramCount;
  74.     unsigned paramShowSize;
  75.     PSTR pszParamName;
  76.     
  77.     pszParams[0] = 0;   // Null out string in case there's no parameters
  78.  
  79.     paramCount = *pParams++;    // Get number of parameters and advance
  80.                                 // to first encoded param
  81.     pFrame++;                   // Bump past the DWORD return address
  82.     
  83.     for ( i=0; i < paramCount; i++ )
  84.     {
  85.         switch ( *pParams )
  86.         {
  87.             case PARAM_DWORD:
  88.                 pszParamName = "DWORD"; paramShowSize = 4; break;
  89.             case PARAM_WORD:
  90.                 pszParamName = "WORD"; paramShowSize = 2; break;
  91.             case PARAM_BYTE:
  92.                 pszParamName = "BYTE"; paramShowSize = 1; break;
  93.             case PARAM_LPSTR:
  94.                 pszParamName = "LPSTR"; paramShowSize = 4; break;
  95.             case PARAM_LPWSTR:
  96.                 pszParamName = "LPWSTR"; paramShowSize = 4; break;
  97.             case PARAM_LPDATA:
  98.                 pszParamName = "LPDATA"; paramShowSize = 4; break;
  99.             case PARAM_HANDLE:
  100.                 pszParamName = "HANDLE"; paramShowSize = 4; break;
  101.             case PARAM_HWND:
  102.                 pszParamName = "HWND"; paramShowSize = 4; break;
  103.             case PARAM_BOOL:
  104.                 pszParamName = "BOOL"; paramShowSize = 4; break;
  105.             case PARAM_LPCODE:
  106.                 pszParamName = "LPCODE"; paramShowSize = 4; break;
  107.             default:
  108.                 pszParamName = "<unknown>"; paramShowSize = 0;
  109.         }
  110.  
  111.         pszParams += wsprintf(pszParams, "%s:", pszParamName);
  112.         
  113.         switch ( paramShowSize )
  114.         {
  115.             case 4: pszParamName = "%08X"; break;
  116.             case 2: pszParamName = "%04X"; break;
  117.             case 1: pszParamName = "%02X"; break;
  118.         }
  119.  
  120.         pszParams += wsprintf(pszParams, pszParamName, *pFrame) ;
  121.  
  122.         // Tack on the string literal value if it's a PARAM_LPSTR
  123.         if ( *pParams == PARAM_LPSTR )
  124.         {
  125.             char buffer[30];
  126.             
  127.             if ( GetLPSTR( (PSTR)*pFrame, buffer ) )
  128.             {
  129.                 strcpy(pszParams, buffer);
  130.                 pszParams += strlen(buffer);
  131.             }
  132.         }
  133.         
  134.         if ( (paramCount - i) != 1 )    // Tack on a comma if not last
  135.             *pszParams++ = ',';         // parameter
  136.         
  137.         pFrame++;   // Bump frame up to the next DWORD value
  138.         pParams++;  // advance to next encoded parameter
  139.     }               // End of for() statement
  140. }
  141.  
  142.  
  143. BOOL GetLPSTR( PSTR ptr, PSTR buffer )
  144. {
  145.     PSTR p = buffer;
  146.     int i;
  147.     
  148.     *p++ = ':';     // Write out initial -> :" <-
  149.     *p++ = '\"';
  150.         
  151.     for ( i=0; i < 10; i++ )
  152.     {
  153.         if ( !IsBadReadPtr( ptr, 1 ) && *ptr )
  154.         {
  155.             *p = *ptr++;
  156.             if ( *p == '\r' ) { *p++ = '\\'; *p = 'r'; }
  157.             else if ( *p == '\n' ) { *p++ = '\\'; *p = 'n'; }
  158.             else if ( *p == '\t' ) { *p++ = '\\'; *p = 't'; }
  159.             
  160.             p++;
  161.         }
  162.         else
  163.             break;
  164.     }
  165.  
  166.     if ( i == 0 )   // Not a valid string
  167.         return FALSE;
  168.     
  169.     *p++ = '\"';    // Valid string ptr - end quote and null
  170.     *p++ = 0;       // terminate the string
  171.     
  172.     return TRUE;
  173. }
  174.  
  175. void LogReturn(PSTR pszName, DWORD returnValue, DWORD level)
  176. {
  177.     char szIndent[128];
  178.  
  179.     if ( !PLogFile )
  180.         return;
  181.     
  182.     MakeIndentString(szIndent, level);
  183.     fprintf(PLogFile, "%s%s returns: %X\n", szIndent, pszName, returnValue);
  184.     fflush(PLogFile);
  185. }
  186.  
  187.  
  188. void MakeIndentString(PSTR buffer, UINT level)
  189. {
  190.     DWORD cBytes = level * 2;
  191.     memset(buffer, ' ', cBytes);
  192.     buffer[cBytes] = 0;
  193. }
  194.  
  195.  
  196.